<!DOCTYPE html>
<html>
    <head>
        <meta charset=utf-8>
    </head>
    <body>
    	
        <script type="text/javascript">

            /**
             * 每次调用同一个+1，新建一个重新计数，一眼老闭包呀
             * 闭包的形成涉及到 JavaScript 引擎如何管理函数的作用域和变量。
             * 当外部函数返回内部函数时，外部函数的执行上下文并没有被销毁，
             * 而是被内部函数的作用域链所引用，因此外部函数的局部变量和参数都得以保留。
             * 说人话就是被内部函数调用的参数会被保留数据，其他的随着外部函数执行完毕销毁
             * 
             * 我们的计时器就是这个原理，当创建一个新的对象时又是一个新的计时器
             * 
             * 我说创建新对象，小友可别被误导new了
             * 在 JavaScript 中，函数的调用方式有两种：
             * 作为普通函数调用和作为构造函数调用（使用 new 关键字）。
             * closure 函数是一个普通函数，它返回一个函数对象，而不是一个构造函数。
             * 每次调用 closure() 都会返回一个新的函数实例。
             */
            const closure = () => {
                // 补全代码
                let count=0;
                return () => {//返回函数，形成闭包
                    return ++count;
                }    
            }
    
            let counter = closure();
            console.log(counter());//1
            console.log(counter());//2
            console.log(counter());//3
            console.log(counter());//4

            let newCounter = closure();
            console.log(newCounter());//1
            console.log(newCounter());//2
            console.log(newCounter());//3
            console.log(newCounter());//4

        </script>
    </body>
</html>